// License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.
// "Business Source License" is a trademark of MariaDB Corporation Ab.

// Parameters

// Licensor:             Union.fi, Labs Inc.
// Licensed Work:        All files under https://github.com/unionlabs/union's sui subdirectory
//                       The Licensed Work is (c) 2024 Union.fi, Labs Inc.
// Change Date:          Four years from the date the Licensed Work is published.
// Change License:       Apache-2.0
//

// For information about alternative licensing arrangements for the Licensed Work,
// please contact info@union.build.

// Notice

// Business Source License 1.1

// Terms

// The Licensor hereby grants you the right to copy, modify, create derivative
// works, redistribute, and make non-production use of the Licensed Work. The
// Licensor may make an Additional Use Grant, above, permitting limited production use.

// Effective on the Change Date, or the fourth anniversary of the first publicly
// available distribution of a specific version of the Licensed Work under this
// License, whichever comes first, the Licensor hereby grants you rights under
// the terms of the Change License, and the rights granted in the paragraph
// above terminate.

// If your use of the Licensed Work does not comply with the requirements
// currently in effect as described in this License, you must purchase a
// commercial license from the Licensor, its affiliated entities, or authorized
// resellers, or you must refrain from using the Licensed Work.

// All copies of the original and modified Licensed Work, and derivative works
// of the Licensed Work, are subject to this License. This License applies
// separately for each version of the Licensed Work and the Change Date may vary
// for each version of the Licensed Work released by Licensor.

// You must conspicuously display this License on each original or modified copy
// of the Licensed Work. If you receive the Licensed Work in original or
// modified form from a third party, the terms and conditions set forth in this
// License apply to your use of that work.

// Any use of the Licensed Work in violation of this License will automatically
// terminate your rights under this License for the current and all other
// versions of the Licensed Work.

// This License does not grant you any right in any trademark or logo of
// Licensor or its affiliates (provided that you may use a trademark or logo of
// Licensor as expressly required by this License).

// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
// AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
// TITLE.

module ibc::create_lens_client_event {
    use std::string::{String};

    public struct CreateLensClientEvent has copy, drop, store {
        client_id: u32,
        l2_chain_id: String,
        l1_client_id: u32,
        l2_client_id: u32
    }

    public(package) fun new(
        client_id: u32,
        l2_chain_id: String,
        l1_client_id: u32,
        l2_client_id: u32
    ): CreateLensClientEvent {
        CreateLensClientEvent { client_id, l2_chain_id, l1_client_id, l2_client_id }
    }

    public(package) fun client_id(self: &CreateLensClientEvent): u32 {
        self.client_id
    }

    public(package) fun l2_chain_id(self: &CreateLensClientEvent): String {
        self.l2_chain_id
    }

    public(package) fun l1_client_id(self: &CreateLensClientEvent): u32 {
        self.l1_client_id
    }

    public(package) fun l2_client_id(self: &CreateLensClientEvent): u32 {
        self.l2_client_id
    }

    #[test_only]
    use std::string::utf8;

    #[test]
    fun test_create_and_getters_ok() {
        let ev = new(7, utf8(b"lens-sepolia"), 1001, 2002);

        assert!(client_id(&ev) == 7, 1);
        assert!(l1_client_id(&ev) == 1001, 2);
        assert!(l2_client_id(&ev) == 2002, 3);
        assert!(l2_chain_id(&ev) == utf8(b"lens-sepolia"), 4);
    }

    #[test]
    fun test_multiple_instances_distinct_values() {
        let ev1 = new(1, utf8(b"a"), 10, 20);
        let ev2 = new(2, utf8(b"b"), 11, 21);

        assert!(client_id(&ev1) == 1, 1);
        assert!(client_id(&ev2) == 2, 2);

        assert!(l1_client_id(&ev1) == 10, 3);
        assert!(l1_client_id(&ev2) == 11, 4);

        assert!(l2_client_id(&ev1) == 20, 5);
        assert!(l2_client_id(&ev2) == 21, 6);

        assert!(l2_chain_id(&ev1) == utf8(b"a"), 7);
        assert!(l2_chain_id(&ev2) == utf8(b"b"), 8);
    }

    #[test]
    fun test_copy_ability_and_getters_still_work() {
        let ev = new(42, utf8(b"chain-x"), 111, 222);

        let ev_copy = copy ev;

        assert!(client_id(&ev) == 42, 1);
        assert!(client_id(&ev_copy) == 42, 2);

        assert!(l1_client_id(&ev) == 111, 3);
        assert!(l1_client_id(&ev_copy) == 111, 4);

        assert!(l2_client_id(&ev) == 222, 5);
        assert!(l2_client_id(&ev_copy) == 222, 6);

        assert!(l2_chain_id(&ev) == utf8(b"chain-x"), 7);
        assert!(l2_chain_id(&ev_copy) == utf8(b"chain-x"), 8);
    }
}
